/**
 * Copyright &copy; 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package org.cboard.security.utils;

import org.apache.commons.lang3.time.DateFormatUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 日期工具类, 继承org.apache.commons.lang.time.DateUtils类
 *
 * @author ThinkGem
 * @version 2014-4-15
 */
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {

    private static String[] parsePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss",
            "yyyy.MM.dd HH:mm", "yyyy.MM"};

    /**
     * 得到当前日期字符串 格式（yyyy-MM-dd）
     */
    public static String getDate() {
        return getDate("yyyy-MM-dd");
    }

    /**
     * 得到当前日期字符串 格式（yyyy-MM）
     */
    public static String getYearDate() {
        return getDate("yyyy-MM");
    }

    /**
     * 得到当前日期字符串 格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
     */
    public static String getDate(String pattern) {
        return DateFormatUtils.format(new Date(), pattern);
    }

    /**
     * 得到日期字符串 默认格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
     */
    public static String formatDate(Date date, Object... pattern) {
        String formatDate = null;
        if (pattern != null && pattern.length > 0) {
            formatDate = DateFormatUtils.format(date, pattern[0].toString());
        } else {
            formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
        }
        return formatDate;
    }

    /**
     * 得到日期字符串 默认格式（yyyy-MM-dd） pattern可以为："yyyy-MM"
     */
    public static String formatDateForMonth(Date date, Object... pattern) {
        String formatDate = null;
        if (pattern != null && pattern.length > 0) {
            formatDate = DateFormatUtils.format(date, pattern[0].toString());
        } else {
            formatDate = DateFormatUtils.format(date, "yyyy-MM");
        }
        return formatDate;
    }

    /**
     * 得到日期时间字符串，转换格式（yyyy-MM-dd HH:mm:ss）
     */
    public static String formatDateTime(Date date) {
        return formatDate(date, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 得到当前时间字符串 格式（HH:mm:ss）
     */
    public static String getTime() {
        return formatDate(new Date(), "HH:mm:ss");
    }

    /**
     * 得到当前日期和时间字符串 格式（yyyy-MM-dd HH:mm:ss）
     */
    public static String getDateTime() {
        return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 得到当前年份字符串 格式（yyyy）
     */
    public static String getYear() {
        return formatDate(new Date(), "yyyy");
    }

    /**
     * 得到当前月份字符串 格式（MM）
     */
    public static String getMonth() {
        return formatDate(new Date(), "MM");
    }

    /**
     * 得到当天字符串 格式（dd）kkkkkkk
     */
    public static String getDay() {
        return formatDate(new Date(), "dd");
    }

    /**
     * 得到当前星期字符串 格式（E）星期几
     */
    public static String getWeek() {
        return formatDate(new Date(), "E");
    }

    /**
     * 日期型字符串转化为日期 格式 { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
     * "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy.MM.dd",
     * "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm" }
     */
    public static Date parseDate(Object str) {
        if (str == null) {
            return null;
        }
        try {
            return parseDate(str.toString(), parsePatterns);
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 获取过去的天数
     *
     * @param date
     * @return
     */
    public static long pastDays(Date date) {
        long t = new Date().getTime() - date.getTime();
        return t / (24 * 60 * 60 * 1000);
    }

    /**
     * 获取过去的小时
     *
     * @param date
     * @return
     */
    public static long pastHour(Date date) {
        long t = new Date().getTime() - date.getTime();
        return t / (60 * 60 * 1000);
    }

    /**
     * 获取过去的分钟
     *
     * @param date
     * @return
     */
    public static long pastMinutes(Date date) {
        long t = new Date().getTime() - date.getTime();
        return t / (60 * 1000);
    }

    /**
     * 转换为时间（天,时:分:秒.毫秒）
     *
     * @param timeMillis
     * @return
     */
    public static String formatDateTime(long timeMillis) {
        long day = timeMillis / (24 * 60 * 60 * 1000);
        long hour = (timeMillis / (60 * 60 * 1000) - day * 24);
        long min = ((timeMillis / (60 * 1000)) - day * 24 * 60 - hour * 60);
        long s = (timeMillis / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
        long sss = (timeMillis - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000);
        return (day > 0 ? day + "," : "") + hour + ":" + min + ":" + s + "." + sss;
    }

    /**
     * 获取两个日期之间的天数
     *
     * @param before
     * @param after
     * @return
     */
    public static double getDistanceOfTwoDate(Date before, Date after) {
        long beforeTime = before.getTime();
        long afterTime = after.getTime();
        return (afterTime - beforeTime) / (1000 * 60 * 60 * 24);
    }

    /**
     * getTodayOfLastMonth:获取上个月的今天. <br/>
     * 获取上个月的今天<br/
     *
     * @return
     * @author duanqingshe
     * @since JDK 1.7
     */
    public static String getTodayOfLastMonth() {
        Date date = new Date();// 当前日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 格式化对象
        Calendar calendar = Calendar.getInstance();// 日历对象
        calendar.setTime(date);// 设置当前日期
        calendar.add(Calendar.MONTH, -1);// 月份减一
        return sdf.format(calendar.getTime());// 输出格式化的日期
    }

    public static String getYearTodayOfLastMonth() {
        Date date = new Date();// 当前日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");// 格式化对象
        Calendar calendar = Calendar.getInstance();// 日历对象
        calendar.setTime(date);// 设置当前日期
        calendar.add(Calendar.MONTH, -12);// 年份减12
        return sdf.format(calendar.getTime());// 输出格式化的日期
    }

    /**
     * 获取指定日期，之前月份之前或者之后的数据
     *
     * @param date
     * @param num
     * @return
     */
    public static String getSpecificYearOfLastMonth(Date date, Integer num) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");// 格式化对象
        Calendar calendar = Calendar.getInstance();// 日历对象
        calendar.setTime(date);// 设置当前日期
        calendar.add(Calendar.MONTH, -num);// 月份减num
        return sdf.format(calendar.getTime());// 输出格式化的日期
    }

    /**
     * 获取指定日期，之前月份之前或者之后的数据
     *
     * @param date
     * @param num
     * @return
     */
    public static String getYesterDay(Date date, Integer num) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 格式化对象
        Calendar calendar = Calendar.getInstance();// 日历对象
        calendar.setTime(date);// 设置当前日期
        calendar.add(Calendar.DAY_OF_YEAR, -num);// 月份减num
        return sdf.format(calendar.getTime());// 输出格式化的日期
    }

    /**
     * 获取去年的同一天日期
     *
     * @param date
     * @return
     */
    public static String getYearToday(Date date) {
        if (date == null) {
            date = new Date();// 当前日期
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 格式化对象
        Calendar calendar = Calendar.getInstance();// 日历对象
        calendar.setTime(date);// 设置当前日期
        calendar.add(Calendar.DAY_OF_YEAR, -1);// 年份减12
        return sdf.format(calendar.getTime());// 输出格式化的日期
    }

    /**
     * 获取下个月的当前天
     *
     * @param date
     * @return
     */
    public static String getDateOfNextMonth(Date date) {
        if (date == null) {
            date = new Date();// 当前日期
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, +1);
        return sdf.format(calendar.getTime());
    }

    /**
     * 获取日期开始：2013-02-02 00：00 ：00
     *
     * @param date
     * @return
     */
    public static String getStartTime(Date date) {
        if (date == null) {
            date = new Date();// 当前日期
        }
        SimpleDateFormat sdf = new SimpleDateFormat(parsePatterns[1]);// 格式化对象
        Calendar calendar = Calendar.getInstance();// 日历对象
        calendar.setTime(date);// 设置当前日期
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return sdf.format(calendar.getTime());// 输出格式化的日期
    }

    /**
     * 获取日期开始：2013-02-02 23：59 ：59
     *
     * @param date
     * @return
     */
    public static String getEndTime(Date date) {
        if (date == null) {
            date = new Date();// 当前日期
        }
        SimpleDateFormat sdf = new SimpleDateFormat(parsePatterns[1]);// 格式化对象
        Calendar calendar = Calendar.getInstance();// 日历对象
        calendar.setTime(date);// 设置当前日期
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        return sdf.format(calendar.getTime());// 输出格式化的日期
    }

    /**
     * 获取明天日期
     *
     * @param date
     * @return
     */
    public static String getTomorrow(Date date) {
        if (date == null) {
            date = new Date();// 当前日期
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 格式化对象
        Calendar calendar = Calendar.getInstance();// 日历对象
        calendar.setTime(date);// 设置当前日期
        calendar.add(Calendar.DAY_OF_YEAR, 1);// 年份减12
        return sdf.format(calendar.getTime());// 输出格式化的日期
    }

    /**
     * 获取明天日期
     *
     * @param date
     * @return
     */
    public static Date getYesterDay(Date date) {
        if (date == null) {
            date = new Date();// 当前日期
        }
        Calendar calendar = Calendar.getInstance();// 日历对象
        calendar.setTime(date);// 设置当前日期
        calendar.add(Calendar.DAY_OF_YEAR, -1);// 年份减12
        return calendar.getTime();// 输出格式化的日期
    }


    /**
     * getNextDayByFormatString:获取本月下一天的日期字符串表示. <br/>
     * 注意日期的时间格式是yyyy-MM-dd.<br/>
     *
     * @param dateStr
     * @return
     * @author duanqingshe
     * @since JDK 1.7
     */
    @SuppressWarnings("static-access")
    public static String getNextDayByFormatString(String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = sdf.parse(dateStr);
        } catch (ParseException e) {
        }
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(calendar.DATE, 1);// 把日期往后增加一天.整数往后推,负数往前移动
        date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
        String putDate = sdf.format(date); // 增加一天后的日期
        return putDate;
    }

    @SuppressWarnings("static-access")
    public static String getNextMonthByFormatString(String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        Date date = null;
        try {
            date = sdf.parse(dateStr);
        } catch (ParseException e) {
        }
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(calendar.MONTH, 1);// 把日期往后增加一天.整数往后推,负数往前移动
        date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
        String putDate = sdf.format(date); // 增加一天后的日期
        return putDate;
    }

    /**
     * 得到两个日期之间的天数 getNumOfDates:(这里用一句话描述这个方法的作用). <br/>
     *
     * @param startDate
     * @param endDate
     * @return
     * @author duanqingshe
     * @since JDK 1.7
     */
    public static Integer getNumOfDates(String startDate, String endDate) {
        int num = 0;
        while (startDate.compareTo(endDate) <= 0) {
            startDate = getNextDayByFormatString(startDate);
            num++;
        }
        return num;
    }

    /**
     * 得到两个日期之间的天数
     */
    public static Integer getNumOfDates(Date smallDate, Date biggerDate) {
        Calendar cNow = Calendar.getInstance();
        Calendar cReturnDate = Calendar.getInstance();
        cNow.setTime(biggerDate);
        cReturnDate.setTime(smallDate);
        setTimeToMidnight(cNow);
        setTimeToMidnight(cReturnDate);
        long todayMs = cNow.getTimeInMillis();
        long returnMs = cReturnDate.getTimeInMillis();
        long intervalMs = todayMs - returnMs;
        return millisecondsToDays(intervalMs);

    }

    private static int millisecondsToDays(long intervalMs) {
        return (int) (intervalMs / (1000 * 86400));
    }

    private static void setTimeToMidnight(Calendar calendar) {
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
    }

    public static Integer getNumOfMonth(String startMonth, String endMonth) {
        int num = 0;
        while (startMonth.compareTo(endMonth) <= 0) {
            startMonth = getNextMonthByFormatString(startMonth);
            num++;
        }
        return num;
    }

    /**
     * getLastYearSameDay:获取统一日期的上一年. <br/>
     *
     * @param dateStr
     * @return
     * @author duanqinGshe
     * @since JDK 1.7
     */
    public static String getLastYearSameDay(String dateStr, int i) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = sdf.parse(dateStr);
        } catch (ParseException e) {
        }
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(Calendar.YEAR, -i);// 把日期往后增加一年.整数往后推,负数往前移动
        date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
        String putDate = sdf.format(date); // 增加一天后的日期
        return putDate;
    }

    public static String getLastYearSameDay(Date date) {
        if (date == null) {
            date = new Date();
        }
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(Calendar.YEAR, -1);// 把日期往后增加一年.整数往后推,负数往前移动
        return formatDate(calendar.getTime());
    }

    /**
     * getLastMonthSameDay:获取上一个月的同一日期. <br/>
     *
     * @param dateStr
     * @param i       从 1 到 12 代表 1到12月的各个月份
     * @return
     * @author duanqinGshe
     * @since JDK 1.7
     */
    @SuppressWarnings({"unused"})
    public static String getLastMonthSameDay(String dateStr, int i) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdf1 = new SimpleDateFormat("dd");

        Date date = null;
        try {
            date = sdf.parse(dateStr);
        } catch (ParseException e) {
        }

        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        // calendar.add(calendar.MONTH, -i);//
        date = calendar.getTime(); //
        String putDate = sdf1.format(date); // 当天的日期
        Calendar calendar1 = new GregorianCalendar();
        SimpleDateFormat sdf2 = new SimpleDateFormat("MM-" + putDate);

        return putDate;
    }

    /**
     * 获取之前i年的年份
     *
     * @param dateStr
     * @param i
     * @return
     * @author Administrator
     * @since JDK 1.7
     */
    @SuppressWarnings("static-access")
    public static String getLastYear(String dateStr, int i) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy");
        Date date = null;
        try {
            date = sdf1.parse(dateStr);
        } catch (ParseException e) {
        }

        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(calendar.YEAR, -i);// 把日期往后增加一年.整数往后推,负数往前移动
        date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
        String putDate = sdf1.format(date); // 增加一天后的日期
        return putDate;
    }

    @SuppressWarnings("static-access")
    public static String getLastYearByYYMM(String dateStr, int i) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy");
        Date date = null;
        try {
            date = sdf.parse(dateStr);
        } catch (ParseException e) {
        }

        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(calendar.YEAR, -i);// 把日期往后增加一年.整数往后推,负数往前移动
        date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
        String putDate = sdf1.format(date); // 增加一天后的日期
        return putDate;
    }

    /**
     * getMonthAndDayInfo:获取某个月的i天的数据. <br/>
     *
     * @param dateStr
     * @return
     * @author Administrator
     * @since JDK 1.7
     */
    public static List<String> getMonthAndDayInfo(String dateStr) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat sdf2 = new SimpleDateFormat("MM-dd");
            SimpleDateFormat sdf3 = new SimpleDateFormat("dd");

            int day = Integer.parseInt(sdf3.format(sdf.parse(dateStr)));

            List<String> list = new ArrayList<>();
            Calendar c = Calendar.getInstance();
            c.setTime(sdf.parse(dateStr));
            c.set(Calendar.MONTH, 0);
            for (int i = 0; i < 12; i++) {
                int day1 = Integer.parseInt(sdf3.format(c.getTime()));
                list.add(sdf2.format(c.getTime()));
                c.add(Calendar.MONTH, 1);
                if (day1 < day) {
                    c.set(Calendar.DAY_OF_MONTH, day);
                }
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    }

    public static List<String> getYearAndMonthInfoByYY(String dateStr) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM");
            List<String> list = new ArrayList<>();
            Calendar c = Calendar.getInstance();
            c.setTime(sdf.parse(dateStr));
            c.set(Calendar.MONTH, 0);
            for (int i = 0; i < 12; i++) {
                list.add(sdf1.format(c.getTime()));
                c.add(Calendar.MONTH, 1);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    }

    public static String getOneDayOfLastMonth(Integer dateNum, Integer day) {
        Date date = new Date();// 当前日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-" + dateNum);// 格式化对象
        Calendar calendar = Calendar.getInstance();// 日历对象
        calendar.setTime(date);// 设置当前日期
        calendar.add(Calendar.MONTH, -1);// 月份减一
        calendar.add(Calendar.DAY_OF_MONTH, day);
        return sdf.format(calendar.getTime());// 输出格式化的日期
    }

    /**
     * 获取前一个月的
     *
     * @param dateNum
     * @return
     */
    public static String getBeforeDayOfToday(Integer dateNum) {
        Date date = new Date();// 当前日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 格式化对象
        Calendar calendar = Calendar.getInstance();// 日历对象
        calendar.setTime(date);// 设置当前日期
        calendar.add(Calendar.DAY_OF_YEAR, dateNum);// 日期加一
        return sdf.format(calendar.getTime());
    }

    /**
     * 获取上个月的天数
     *
     * @return
     */
    public static Integer getLastMonthDaysNum() {
        // 取得系统当前时间
        Calendar cal = Calendar.getInstance();
        // 取得系统当前时间所在月第一天时间对象
        cal.set(Calendar.DAY_OF_MONTH, 1);
        // 日期减一,取得上月最后一天时间对象
        cal.add(Calendar.DAY_OF_MONTH, -1);
        // 输出上月最后一天日期
        // System.out.println(cal.get(Calendar.DAY_OF_MONTH));
        return cal.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * 获取上个月的时间格式为 yyyy-MM-01
     *
     * @return
     */
    public static String getLastMonthBySpecificFormat(String format) {
        Date date = new Date();// 当前日期
        SimpleDateFormat sdf = new SimpleDateFormat(format);// 格式化对象
        Calendar calendar = Calendar.getInstance();// 日历对象
        calendar.setTime(date);// 设置当前日期
        calendar.add(Calendar.MONTH, -1);// 月份减一
        return sdf.format(calendar.getTime());// 输出格式化的日期
    }

    public static String getLastMonthBySpecficFormat(Date date, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);// 格式化对象
        Calendar calendar = Calendar.getInstance();// 日历对象
        calendar.setTime(date);// 设置当前日期
        calendar.add(Calendar.MONTH, -1);// 月份减一
        return sdf.format(calendar.getTime());// 输出格式化的日期
    }

    /**
     * 计算对应的数据格式
     *
     * @param value
     * @return
     */
    public static Double calculateSpecficMethod(Double value) {
        if (value == null) {
            value = 0.0;
        }
        // 1 计算上个月的天数
        Integer monthDaysLastMonth = DateUtils.getLastMonthDaysNum();
        // 2 根据计算公式计算数据
        return (value * monthDaysLastMonth) / 365.0;
    }

    /**
     * 根据跟定的年份和月份组合对应的日期
     *
     * @param year
     * @param month
     * @return
     */
    public static String getSpecificYearAndDate(String year, String month, Integer num) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-01");
        Calendar c = Calendar.getInstance();
        c.set(c.YEAR, Integer.parseInt(year));// 设置年
        c.set(c.MONTH, Integer.parseInt(month) - num);// 设置月
        return (sdf.format(c.getTime()));
    }

    /**
     * 获取指定年的上一年
     *
     * @return
     */
    public static String getSpecificYearsLastYear(String year) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        Calendar c = Calendar.getInstance();
        c.set(c.YEAR, Integer.parseInt(year));// 设置年
        c.add(Calendar.YEAR, -1);
        return sdf.format(c.getTime());
    }

    /**
     * 根据年份和月份取得某一年某个月的上个月
     *
     * @param year
     * @param month
     * @return
     */
    public static String getSpecficMonthLastMonth(String year, String month) {
        SimpleDateFormat sdf = new SimpleDateFormat("MM");
        Calendar c = Calendar.getInstance();
        c.set(c.YEAR, Integer.parseInt(year));// 设置年
        c.set(c.MONTH, Integer.parseInt(month));// 设置月
        c.add(Calendar.MONTH, -1);
        return sdf.format(c.getTime());
    }


    public static Date getDateBySpecificYear(String year) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-01-01");
        Calendar c = Calendar.getInstance();
        c.set(c.YEAR, Integer.parseInt(year));// 设置年
        c.set(c.MONTH, 0);
        c.set(c.DAY_OF_MONTH, 1);
        simpleDateFormat.format(c.getTime());
        return c.getTime();
    }

    /**
     * 将传入的字符串格式化为yyyy-MM-dd
     *
     * @param str
     * @return
     */
    public static Date getFormatNowTime(String str) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date;
        try {
            date = sdf.parse(str);
            return date;
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }


    public static String getLastMonthDay(String dateTime, int i) {

        SimpleDateFormat sdf = new SimpleDateFormat(parsePatterns[0]);
        Calendar calendar = Calendar.getInstance();

        try {
            Date date = sdf.parse(dateTime);
            calendar.setTime(date);
            calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - i);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return sdf.format(calendar.getTime());
    }


    public static Integer getMonthDays(String year, String month) {
        Calendar cal = Calendar.getInstance();
        //下面可以设置月份，注：月份设置要减1，所以设置1月就是1-1，设置2月就是2-1，如此类推
        cal.set(Calendar.MONTH, Integer.parseInt(month) - 1);
        cal.set(Calendar.YEAR, Integer.parseInt(year));
        //得到一个月最最后一天日期(31/30/29/28)
        int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        return maxDay;
    }

    /**
     * @param args
     * @throws ParseException
     */
    public static void main(String[] args) throws Exception {
        System.out.println(getSpecificYearAndDate("2014", "01", -20));
        Object hello = (Object) null;
        System.out.println(getNextDayByFormatString("2016-03-19"));
    }

    /**
     * @param yearValue 年
     * @return
     */
    public static String formattingTime(String yearValue) {
        return yearValue + "-01" + "-1";
    }

    /**
     * 获取当年第一天时间
     *
     * @return
     */
    public static String getStartTime() {
        String[] time = formatDate(new Date()).split("-");
        int year = Integer.parseInt(time[0]);
        if (Integer.parseInt(time[1]) != 12) {
            year = year - 1;
        } else {
            if (Integer.parseInt(time[2]) <= 25) {
                year = year - 1;
            }
        }

        return year + "-12" + "-26";
    }

    public static String findFirstDayOfNowTime() {
        String[] time = formatDate(new Date()).split("-");
        return time[0] + "-" + time[1] + "-01";
    }

    /**
     * 获取最后一天的时间
     *
     * @param year
     * @return
     */
    public static String getEndTime(String year) {
        return year + "-12" + "-25";
    }

    /**
     * 获取当月第一天时间
     *
     * @return
     */
    public static String getStartTimeByMonth(String dateTime) {
        String[] time = dateTime.split("-");
        int month = Integer.parseInt(time[1]);
        int year = Integer.parseInt(time[0]);
        int day = Integer.parseInt(time[2]);
        if (day < 26) {
            if (month == 1) {
                year = year - 1;
                return year + "-12" + "-26";
            } else {
                month = month - 1;
                return year + month + "-26";
            }
        } else {
            return year + month + "-26";
        }
    }

    /**
     * 获取对应日期所在的最后一天
     *
     * @param dateTime
     * @return
     */
    public static String getEndTimeByMonth(String dateTime) {
        String[] time = dateTime.split("-");
        int month = Integer.parseInt(time[1]);
        int year = Integer.parseInt(time[0]);
        int day = Integer.parseInt(time[2]);
        if (month == 12) {
            if (day > 25) {
                year = year + 1;
                return year + "-01" + "-25";
            } else {
                return year + "-" + month + "-25";
            }
        } else {
            if (day > 25) {
                month = month + 1;
                return year + "-" + month + "-25";
            } else {
                return year + "-" + month + "-25";
            }
        }
    }

}
